package Infoclient;

import Protocol.ReturnObject;
import java.awt.Color;
import java.awt.Dimension;
import java.util.ArrayList;
import javax.swing.JPanel;
import java.awt.Graphics;

/**
 *  Klasse welke de methodes voor aanmaak pie chart bevat
 * @author Roman
 * @since 07-05-2012
 */
public class Piechart extends JPanel {

    private ArrayList<Integer> amountList;
    private ArrayList<String> legendList;
    private ArrayList<Color> colorList;
    private int columnCounter = 0;
    private int rowCounter = 0;
    private int totalAmount = 0;
    private int textLocation = 15;
    private boolean infoVerwerkt = false;
    private Infoclient ic;
    private int scrollHeight = 0;

    /**
    * Constructor die ArrayLists aanmaakt.
    * @author Roman Wiedijk
    * @since 16-05-2012
    */
    
    public Piechart(Infoclient ic) {
        //Maakt ArrayLists aan.
        amountList = new ArrayList();
        legendList = new ArrayList();
        colorList = new ArrayList();
        this.ic = ic;
        setLayout(null);
    }

    /**
    * Blijft het taartdiagram en de legenda constant tekenen. 
    * @author Roman Wiedijk
    * @since 16-05-2012
    */
    
    public void paintComponent(Graphics g) {
        //Tekent het taartdiagram als de query is aangemaakt.
        super.paintComponent(g);
        drawPiechart(g);
        ic.getGUI().getPie().setPreferredSize(new Dimension(0, scrollHeight));   
        ic.getGUI().getPie().revalidate();
    }

    /**
    * Functie voor het controleren op Integers. 
    * @author Roman Wiedijk
    * @since 16-05-2012
    */
    
    public boolean isInt(String string) {
        try {
            //indien geen foutmelding: het is een integer.
            Integer.parseInt(string);
            return true;
        } catch (Exception e) {
            //Indien foutmelding: het is geen integer.
            return false;
        }
    }

    /**
    * Random kleurengeneratie met behulp van Math.random(). 
    * @author Roman Wiedijk
    * @since 16-05-2012
    */
    
    public void generateColor() {
        //Maakt 3 kleuren aan, stopt deze in een ArrayList met kleuren.
        int R = (int) (Math.random() * 256);
        int G = (int) (Math.random() * 256);
        int B = (int) (Math.random() * 256);
        colorList.add(new Color(R, G, B));
    }

    /**
    * Vult de eerder aangemaakte ArrayLists met gegevens uit de opgeroepen query.
    * @author Roman Wiedijk
    * @since 16-05-2012
    */
    
    public void verwerkReturnObject(ReturnObject ro) {
        columnCounter = 0;
        totalAmount = 0;

        legendList.clear();
        amountList.clear();
        colorList.clear();

        for (String s : ro.getKolommen()) {
            //Controleert het aantal kolommen.
            columnCounter++;
        }
        for (ArrayList a : ro.getRijen()) {
            for (Object s : a) {
                //Voor tests
                //rowCounter++;
                //Als het object niet leeg is.
                if (s != null) {
                    //Als het een int is.
                    if (isInt(s.toString())) {
                        int currentAmount = Integer.parseInt(s.toString());
                        amountList.add(currentAmount);
                        totalAmount += currentAmount;
                        //Genereer een kleur voor ieder eerste object (dus wat een Integer is).
                        generateColor();
                    } else {
                        //Als het geen int is: legenda item.
                        legendList.add(s.toString());
                        rowCounter++;
                    }
                } else {
                    //Als het object leeg is, dan is het een legenda item. Items met integers horen niet leeg te zijn.
                    System.out.println("Nullpointer!");
                    legendList.add("Geen");
                }
            }
        }        
        infoVerwerkt = true;
    }

    /**
    * Tekent alle gegevens uit de eerder opgeslagen ArrayLists verwerken in een legenda en taartdiagram. 
    * @author Roman Wiedijk
    * @since 16-05-2012
    */
    
    public void drawPiechart(Graphics g) {
        if (infoVerwerkt == true) {
            double currentAmount = 0.0D;
            int startDegrees = 0;
            int arcDegrees = 0;
            int drawnColumns = 0;

            g.drawString("Kleur", 250, textLocation);
            g.drawString("Item", 330, textLocation);
            g.drawString("Aantal", 405, textLocation);

            textLocation += 20;
            for (int i = 0; i < amountList.size(); i++) {
                //Circeldiagram
                //Zet het aantal graden voor het huidige aantal neer.
                startDegrees = (int) ((currentAmount / totalAmount) * 360);

                //Haalt een kleur uit de lijst met kleuren.
                g.setColor(colorList.get(i));

                //Wat getekent wordt is: 360 graden - het huidige aantal.
                //Dit zorgt ervoor dat telkens een kleiner gedeelte linksom wordt getekend.
                arcDegrees = 360 - startDegrees;

                //Zet het beginpunt bovenaan, en tekent linksom om lege ruimtes te voorkomen.
                g.fillArc(0, 0, 250, 250, 90, arcDegrees);
                currentAmount += amountList.get(i);

                //Legenda
                //Tekent een vakje met de huidige kleur.
                g.fillRect(260, textLocation - 9, 10, 10);
                g.setColor(Color.black);

                //Teken het percentage (uitgeschakelt).
                //g.drawString(amountList.get(i) * 100 / totalAmount + "%", 435, textLocation);

                //Teken het huidige aantal.
                g.drawString(amountList.get(i).toString(), 430, textLocation);

                for (int c = 0; c < columnCounter - 1; c++) {
                    //Legenda Item uitschrijven.

                    g.drawString(legendList.get(drawnColumns), 275, textLocation);

                    textLocation += 20;
                    drawnColumns++;
                }
            }
            g.drawString("Totaal: " + totalAmount, 250, textLocation);            
            scrollHeight = textLocation;
            textLocation = 15;
        }
    }
}
